import axios from "axios";
import router from "@/router";
import type {AxiosResponse} from "axios"
// import { Message } from "element-ui";




// 自定义实例默认值 (实例可以有多个  全局只能有一个)
// 创建实例时配置默认值
const request = axios.create({
    baseURL: 'http://43.138.81.225:5566/api',  // 当前实例的默认请求位置
    // baseURL: 'http://localhost:3000/api'  // 当前实例的默认请求位置
});

// 创建实例后修改默认值
// request.defaults.headers.common['Authorization'] = AUTH_TOKEN;
request.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';  // post传参 默认携带数据类型


// 添加请求拦截器  =>  在请求发送之前进行拦截 (可以获取请求相关的信息 -> 并对信息做处理,额外携带其他信息) 
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么

    // 很多接口 在接收前端请求时 都要求携带 token(用户身份标识 -> 后端)

    // 有token 就携带
    // var str = localStorage.getItem("AuthorityInfo");
    // if (str) {
    //     var data = JSON.parse(str);
    //     var token = data.token;
    //     if (token) {
    //         config.headers["token"] = token;
    //     }
    // }
    // console.log("准备发送请求", config); // 请求相关的配置 => {method,url,baseURL,headers}  




    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器  => 在服务端响应结束,数据返回之后=> axios的then()/catch()方法接收数据之前进行拦截 (函数中返回的数据 就是后续then方法接收的数据)
request.interceptors.response.use(function (response:AxiosResponse) {
    // response => axios处理之后的响应的数据对象 {config,headers,data,request,status}
    // 2xx 范围内的状态码都会触发该函数。 (响应成功 -> 后端接收数据,返回结果)

    // console.log("响应拦截",response);
    const res:AxiosResponse["data"] = response.data;  // 响应成功的前提下获取响应数据
    const { code, message } = res;

    const isSuccess:boolean = code == 200;  // 响应成功-> 操作成功
    const isTokenBreak:boolean = code == 10119;  // 响应成功-> token过期

    // // 对响应数据做点什么 (可以自己定义要返回的数据)
    if (isSuccess) {  // 响应成功 -> 操作成功  (登录 -> 登录成功)
        return res;   // 响应成功-> 操作成功 数据(data)
    } else if (isTokenBreak) { // 响应成功-> token过期 -> 去登录(登录成功返回原位置)
        // this指向有问题  -> 不能这么写

        // this.$message.error("xxxx")
        // this.$router.push({name:"login",query:{ReturnUrl:this.$route.fullPath}})



        // console.log("router", router);  //路由实例 
        // router.currentRoute  当前路由信息

        // Message.error("token过期,请重新登录");
        // router.push({ name: "login", query: { ReturnUrl: router.currentRoute.fullPath } })

        const error = new Error(message);
        return Promise.reject(error);

    } else {  // 10003  10005   1000xx
        // 响应成功 -> 操作成功   => (登录 -> 登录失败(不存在该用户  密码有误))
        const error = new Error(message);
        return Promise.reject(error)  //  // 响应成功-> 操作失败 => 失败状态Promise实例
    }

    // return response;   // 成功正常返回response {config,headers,data,request,status}
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。  // 1xx 3xx 4xx 5xx  响应失败
    // 对响应错误做点什么
    return Promise.reject(error);  // 失败返回 已失败状态的Promise实例
});




export default request;


